Skip to content

1. Symmetric Stiffness Tensor and Voigt notation

1. Concepts

(1) Symmetric relations in

Voigt notation is a simple way to represent a symmetric tensor.
For a 2×2 symmetric matrix with x12=x21:

(1.1.1)X=[x11x12x21x22]voigt index[x11x22x12]
python
0 -> (0,0)
1 -> (1,1)
2 -> (0,1) and (1,0)

For 3×3 symmetric strain matrix. There's 6 independent coordinates :

(1.1.2)σ=[σ11σ12σ13σ21σ22σ23σ31σ32σ33]=[σ1σ2σ3σ4σ5σ6]where σ4=σ23σ5=σ13σ6=σ12
sh
0 -> (0,0)
1 -> (1,1)
2 -> (2,2)
3 -> (1,2) and (2,1) 
4 -> (0,2) and (2,0) 
5 -> (0,1) and (1,0)

Conventional sequence We often use σ4=σ23σ5=σ13σ6=σ12 here.

For general formula for the number of Voigt indices can be calculated by

(1.1.3)Number of Voigt indices=(d+n1n)=Cd+n1n

Note here we know from

(1.1.4)A(n,r)=n!(nr)!C(n,r)=n!(nr)!r!

where tensor rank is n and d is dimension of space.

(2) Symmetry of stiffness tensor

For elastic tensors Eijkl It's a 4-th order tensor, which has 3x3x3x3 = 81 elements. In a general case, Eijkl is generally do not have this full symmetry.But under the assumption of symmetric stress and strain :

(1.2.1)σij=σjiεij=εji

We have 2 minor symmetries :

(1.2.2)Cijkl=CjiklCijkl=Cijlk

And also under a strain-energy relation :

(1.2.3)W=12Cijklεijεkl=12CklijεklεijCijkl=2Wεijεkl=Cklij

So a general anisotropic elastic material usually satisfy the minor and major symmetries :

(1.2.4)Cijkl=Cjikl=Cijlk=Cklij

We can use a symmetric 6×6 matrix with 21 independent constants to express the stiffness of a general anisotropic elastic material.

So by setting ij=I,kl=J, We can also use Voigt Index to map the 9×9 stiffness matrix into a 6×6 one, as shown in Fig. 1.1. We also note, in the composite mechanics, the general Hook's Law [1] use a 6x6 matrix.

6x6 stiffness matrix in voigt notation

6x6 stiffness matrix in voigt notation

which is 3x3 matrix (6 independent variable)

The sequence in picture is not same as conventional sequence, but valid for a

σ4=σ01σ5=σ02σ6=σ12

which is the sequence we later applied in the programming.

Why we often use the conventional sequence is because the consistency for 2D form :

C=[C11C12C16C12C22C26C16C26C66]

(3) Common symmetry classes

Material symmetryIndependent constantsTypical examples
Triclinic21General anisotropic crystal or composite
Monoclinic13Certain layered crystals and laminates
Orthotropic9Wood, woven composites, plywood
Transversely isotropic5Unidirectional fiber composites, graphite
Cubic3Silicon, copper, aluminum single crystals
Isotropic2Glass, isotropic polycrystals, random particulate composites
For the orthotropic material[2], An orthotropic material has three orthogonal symmetry planes. Since the symmetric plane yields C=AεTCAε (Derivation can be found in [2:1]). The stiffness at 4,5,6 out of diagonal is 0 :
(1.3.1)Cortho=[C11C12C13000C12C22C23000C13C23C33000000C44000000C55000000C66].

A transversely isotropic material[3], with symmetry axis 3, the matrix is :

(1.3.2)CTI=[C11C12C13000C12C11C13000C13C13C33000000C44000000C44000000C11C122]

Cubic symmetric materials :

(1.3.3)Ccubic=[C11C12C12000C12C11C12000C12C12C11000000C44000000C44000000C44]

For the isotropic materials, we further have C44=C11C122, so we can express them to λ and μ :

(1.3.4)Ciso=[λ+2μλλ000λλ+2μλ000λλλ+2μ000000μ000000μ000000μ]

2. Transformation for Tensors and Voigt notations

(1) Engineering Strain vector

For strain with engineering strain notation, we should use :

(2.1.1)ϵv=[ϵ11ϵ22ϵ332ϵ122ϵ232ϵ13]

This is because, the shear stress is σij=Cijklεjk, when jk, the component is :

(2.1.2)Cijklεkl+Cijlkεlk

That is, when computing the stress, we should use the engineering strain vector to keep the expression consistent. So in the general Hook's Law[1:1][4], we have :

(2.1.3)σ=C:εv

where εv is engineering strain vector.

(2) Implementation

We can transfer the format of them using the following two functions :

python
def tensor_to_voigt(tensor, *, engineering_shear: bool = False):
    r"""Return the Voigt vector of a symmetric tensor.

    The component order is ``[xx, yy, xy]`` in 2-D and
    ``[xx, yy, zz, xy, xz, yz]`` in 3-D. Set ``engineering_shear`` to
    ``True`` to multiply shear entries by two, as required for engineering
    strain vectors.
    """
    dim = tensor.ufl_shape[0]
    shear_scale = 2 if engineering_shear else 1
    if dim == 2:
        return ufl.as_vector(
            (tensor[0, 0], tensor[1, 1], shear_scale * tensor[0, 1])
        )
    if dim == 3:
        return ufl.as_vector(
            (
                tensor[0, 0],
                tensor[1, 1],
                tensor[2, 2],
                shear_scale * tensor[0, 1],
                shear_scale * tensor[0, 2],
                shear_scale * tensor[1, 2],
            )
        )
    raise ValueError("Voigt conversion supports only two- and three-dimensional tensors.")


def voigt_to_tensor(voigt, dim: int, *, engineering_shear: bool = False):
    r"""Return the symmetric tensor associated with a Voigt vector.

    The input component order is ``[xx, yy, xy]`` in 2-D and
    ``[xx, yy, zz, xy, xz, yz]`` in 3-D. Set ``engineering_shear`` to
    ``True`` when the input stores engineering shear entries, which are divided
    by two before constructing the tensor.
    """
    shear_scale = 0.5 if engineering_shear else 1
    if dim == 2:
        return ufl.as_matrix(
            ((voigt[0], shear_scale * voigt[2]),
             (shear_scale * voigt[2], voigt[1]))
        )
    if dim == 3:
        return ufl.as_matrix(
            (
                (voigt[0], shear_scale * voigt[3], shear_scale * voigt[4]),
                (shear_scale * voigt[3], voigt[1], shear_scale * voigt[5]),
                (shear_scale * voigt[4], shear_scale * voigt[5], voigt[2]),
            )
        )
    raise ValueError("Voigt conversion supports only two- and three-dimensional tensors.")

  1. https://pkel015.connect.amazon.auckland.ac.nz/SolidMechanicsBooks/Part_I/BookSM_Part_I/06_LinearElasticity/06_Linear_Elasticity_03_Anisotropy.pdf ↩︎ ↩︎

  2. https://en.wikipedia.org/wiki/Orthotropic_material ↩︎ ↩︎

  3. https://en.wikipedia.org/wiki/Transverse_isotropy ↩︎

  4. https://en.wikipedia.org/wiki/Hooke's_law ↩︎